package com.dpac.core.util;

import java.util.List;

import org.apache.commons.lang3.StringUtils;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * @title Json操作工具类
 * @description 用于对json数据操作的工具类(可以对属性值为null的,不进行序列化)
 * @creator lils
 * @date 2017年3月6日 下午2:14:00
 */
public class JsonUtils {

	private static final ObjectMapper MAPPER = new ObjectMapper();

	/**
	 * 将对象转换成Json字符串
	 * @param objObject 对象
	 * @return
	 */
	public static String objectToJson(Object objObject) {
		String sJson = null;
		if (objObject == null) return sJson;
		try {
			// 属性为NULL 不序列化 / NON_EMPTY属性为 空（""） 或者为 NULL 都不序列化
			MAPPER.setSerializationInclusion(Include.NON_NULL);
			sJson = MAPPER.writeValueAsString(objObject);
		} catch (Exception e) {
			// e.printStackTrace();
			System.out.println("JsonUtils.objectToJson转换出错=" + e.getMessage());
		}
		return sJson;
	}

	/**
	 * 将Json字符串转换成对象
	 * @param sJson Json字符串
	 * @param clsType 对象的类型
	 * @return
	 */
	public static <T> T jsonToObject(String sJson, Class<T> clsType) {
		T t = null;
		if (StringUtils.isEmpty(sJson) || clsType == null) return t;
		try {
			t = MAPPER.readValue(sJson, clsType);
		} catch (Exception e) {
			// e.printStackTrace();
			System.out.println("JsonUtils.jsonToObject转换出错=" + e.getMessage() + "，原sJson=" + sJson + "，要转换的class=" + clsType.toString());
		}
		return t;
	}

	/**
	 * 将Json字符串转换成List
	 * @param sJson Json字符串
	 * @param clsType 对象的类型
	 * @return
	 */
	public static <T> List<T> jsonToList(String sJson, Class<T> clsType) {
		List<T> lstResult = null;
		if (StringUtils.isEmpty(sJson) || clsType == null) return lstResult;
		try {
			JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, clsType);
			lstResult = MAPPER.readValue(sJson, javaType);
		} catch (Exception e) {
			// e.printStackTrace();
			System.out.println("JsonUtils.jsonToList转换出错=" + e.getMessage() + "，原sJson=" + sJson + "，要转换的class=" + clsType.toString());
		}
		return lstResult;
	}

}
